/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ca.etsmtl.log660.facade;


import ca.etsmtl.log660.configuration.SessionFactoryHelper;
import ca.etsmtl.log660.entity.Film;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author iamthegD
 */
public class FilmFacade {

    private static FilmFacade instance = new FilmFacade();

    private FilmFacade(){

    }

    public List<Film> findFilmByCriteria(List<String> titres, List<String> genres,
            String anneeMin, String anneeMax, List<String> paysProd, List<String> langueOriginal,
            List<String> nomRealisateur, List<String> nomActeurs ){

        Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        List<Film> filmslist = new ArrayList();
        
        boolean flag1=false,flag2=false,flag3=false,flag4=false,flag5=false,flag6=false,flag7=false;
        
        String s_query = "From Film where";

        if(titres.size() > 0){
            s_query = s_query + " titre in (:titres) or";
            flag1 = true;
        }
        if(genres.size() > 0){
            s_query = s_query + " genreFilms in (:genres) or";
            flag2 = true;
        }
        if(!anneeMin.equals("") && !anneeMax.equals("")){
            s_query = s_query + " anneeSortie between :anneeMin and :anneeMax or";    
            flag3 = true;
        }
        if(paysProd.size() > 0){
            s_query = s_query + " paysProd in (:paysProd) or";
             flag4 = true;
        }
        if(langueOriginal.size() > 0){
            s_query = s_query + " langue in (:langueOriginal) or";
             flag5 = true;
        }
        if(nomActeurs.size() > 0 ){
             s_query = s_query + " personnes in (:nomActeurs) or";
              flag6 = true;
        }
        if(nomRealisateur.size() > 0){
         s_query = s_query + " personne in (:nomRealisateur) or";
          flag7 = true;
        }

        // on enleve le dernier or
        if(flag1 || flag2 || flag3 || flag4 || flag5 || flag6 || flag7){
            s_query = s_query.substring(0, s_query.length()-2);
        
            System.out.println(s_query);
                
            Query query = session.createQuery(s_query);

            if( flag1){
                query.setParameterList("titres", titres);
            }
            if( flag2){
                query.setParameterList("genres", genres);
            }
            if( flag3){
                query.setParameter("anneeMin", Date.valueOf(anneeMin));
                query.setParameter("anneeMax", Date.valueOf(anneeMax));
            }
            if( flag4){
                query.setParameterList("paysProd", paysProd);
            }
            if( flag5){
                query.setParameterList("langueOriginal", langueOriginal);
            }
            if( flag6){
                query.setParameterList("nomRealisateur", nomRealisateur);
            }
            if( flag7){
                query.setParameterList("nomActeurs", nomActeurs);
            }

            filmslist =  query.list();
        }
        session.close();
        return filmslist;
    }

    public static FilmFacade getInstance(){
        return instance;
    }
}
